package com.wang.spring.lifecycle.d_prototype;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class PrototypeLifecycleApplication {

    public static void main(String[] args) {
//        test1();
        test2();


    }

    private static void test1() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(PrototypeLifecycleConfiguration.class);
        // 可以看到 原型bean没有随 IOC容器的初始化而初始化
        System.out.println("IOC 容器初始化完成");
        Pen bean = ctx.getBean(Pen.class);
        System.out.println("==================");
        System.out.println(bean);
        System.out.println("==================");
        System.out.println("容器销毁----开始");
        ctx.close();
        // 可以发现 虽然容器关闭了但是没有调用 bean的destroy方法，三种destroy方法都没有调用
        System.out.println("容器销毁----完成");
    }


    /**
     * IOC 容器初始化完成
     * @PostConstruct 开始执行 加墨水
     * Pen3 钢笔中已经加满墨水  InitializingBean.afterPropertiesSet
     * init-method 打开钢笔
     * ==================
     * Pen{ink=100}
     * ==================
     * 销毁bean ======= 开始
     * @PreDestroy 销毁 导出墨水
     * Pen3 钢笔中墨水都放干净了  DisposableBean.destroy
     * 销毁bean ======= 完成
     * 容器销毁----开始
     * 容器销毁----完成
     *
     *
     * 从打印结果可以看出 原型bean的销毁没有调用 destroy-method  调用了 另外两个destroy方法
     *
     *
     * 原型Bean的 初始化 动作与 单实例Bean 完全一致
     */
    private static void test2() {
        AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(PrototypeLifecycleConfiguration.class);
        // 可以看到 原型bean没有随 IOC容器的初始化而初始化
        System.out.println("IOC 容器初始化完成");
        Pen bean = ctx.getBean(Pen.class);
        System.out.println("==================");
        System.out.println(bean);
        System.out.println("==================");
        System.out.println("销毁bean ======= 开始");
        ctx.getBeanFactory().destroyBean(bean);

        System.out.println("销毁bean ======= 完成");
        System.out.println("容器销毁----开始");
        ctx.close();
        // 可以发现 虽然容器关闭了但是没有调用 bean的destroy方法，三种destroy方法都没有调用
        System.out.println("容器销毁----完成");
    }
}
